#Requires AutoHotkey v2.0

; 三路快速排序的实现
threeWayQuickSort(arr, low, high) {

    ; 要排序的元素数量为0或者负数
    if (low >= high) {
        return
    }
    lt := low ; 小于基准值部分的结束位置
    gt := high ; 大于基准值部分的开始位置
    pivot := arr[low]
    i := low + 1
    
    ; 循环条件(小于基准部分)
    while (i <= gt) { 
        if (arr[i] < pivot) { ; 小于基准值
            arr[i], arr[lt] := arr[lt], arr[i] ; 交换值
            lt++
            i++
        } else if (arr[i] > pivot) { ; 大于基准值
            arr[i], arr[gt] := arr[gt], arr[i]
            gt--
        } else {
            i++
        }
    }

    ; 递归对小于和大于基准值的部分排序
    threeWayQuickSort(arr, low, lt - 1)
    threeWayQuickSort(arr, gt + 1, high)
}

; 示例使用
arr := [5, 3, 9, 3, 5, 1, 3, 5, 7]
threeWayQuickSort(arr, 1, arr.Length)

arrtext := ""
loop arr.Length{
    arrtext .= arr[A_Index] . ","
}
MsgBox arrtext